home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 2
/
CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso
/
magazine
/
amiga_e
/
capus2
/
3dview
/
sources
/
3dfonctions.e
< prev
next >
Wrap
Text File
|
1994-10-09
|
13KB
|
311 lines
/*"Rotation et refresh de la vue 3D."*/
/*"p_RotationBase(r_axe,r_angle) :Effectue une rotation de tous les objs.<r_axe>=Axe (3dview.m),<r_angle>=en rad."*/
PROC p_RotationBase(r_axe,r_angle)
/********************************************************************************
* Para : Axe of rotation (see 3Dview.i or .m),Angle (in rad).
* Return : NONE
* Description : Rotate all objects.
*******************************************************************************/
DEF old_x=NIL,old_y=NIL,old_z=NIL
DEF new_x=NIL,new_y=NIL,new_z=NIL
DEF adr_x=NIL,adr_y=NIL,adr_z=NIL
DEF r_obj:PTR TO object3d,r_point=NIL,n_pts=NIL,b_pts=NIL
DEF r_req=NIL
DEF thelist:PTR TO lh,thenode:PTR TO ln
dWriteF(['p_RotationBase() Axe:\d',' Angle :\d\n'],[r_axe,r_angle])
r_req:=p_InitReq('Rotate Object(s) ')
thelist:=mybase.objlist
thenode:=thelist.head
WHILE thenode
IF thenode.succ<>0
r_obj:=thenode
r_point:=r_obj.datapts
n_pts:=r_obj.nbrspts
FOR b_pts:=0 TO n_pts-1
adr_x:=r_point
adr_y:=r_point+4
adr_z:=r_point+8
old_x:=Long(adr_x)
old_y:=Long(adr_y)
old_z:=Long(adr_z)
SELECT r_axe
CASE AXE_X
new_x:=SpFlt(old_x)
new_y:=SpSub(SpMul(SpFlt(old_z),SpSin(r_angle)),SpMul(SpFlt(old_y),SpCos(r_angle)))
new_z:=SpAdd(SpMul(SpFlt(old_y),SpSin(r_angle)),SpMul(SpFlt(old_z),SpCos(r_angle)))
CASE AXE_Y
new_x:=SpSub(SpMul(SpFlt(old_z),SpSin(r_angle)),SpMul(SpFlt(old_x),SpCos(r_angle)))
new_y:=SpFlt(old_y)
new_z:=SpAdd(SpMul(SpFlt(old_x),SpSin(r_angle)),SpMul(SpFlt(old_z),SpCos(r_angle)))
CASE AXE_Z
new_x:=SpSub(SpMul(SpFlt(old_y),SpSin(r_angle)),SpMul(SpFlt(old_x),SpCos(r_angle)))
new_y:=SpAdd(SpMul(SpFlt(old_x),SpSin(r_angle)),SpMul(SpFlt(old_y),SpCos(r_angle)))
new_z:=SpFlt(old_z)
ENDSELECT
^adr_x:=SpFix(new_x)
^adr_y:=SpFix(new_y)
^adr_z:=SpFix(new_z)
r_point:=r_point+12
ENDFOR
ENDIF
thenode:=thenode.succ
ENDWHILE
CloseW(r_req)
ENDPROC
/**/
/*"p_DrawBase() :redessine le base 3D."*/
PROC p_DrawBase()
/********************************************************************************
* Para : NONE
* Return : NONE
* Description : Parse objects (bounded,selected) and call draw_face().
*******************************************************************************/
DEF d_obj:PTR TO object3d
DEF b_faces,t_faces,d_faces,curs
DEF stop_mes:PTR TO intuimessage,stop_type,stop_infos
DEF adr_req
DEF mylist:PTR TO lh,mynode:PTR TO ln
/*DEF num_obj,num_p1,num_p2,num_p3*/
DEF list_vertices,list_datapts
dWriteF(['p_DrawBase()'],[0])
adr_req:=p_InitReq('Drawing ')
SetAPen(view_window.rport,0)
SetRast(view_window.rport,0)
SetAPen(view_window.rport,1)
mylist:=mybase.objlist
mynode:=mylist.head
WHILE mynode
IF mynode.succ<>0
d_obj:=mynode
IF d_obj.selected=TRUE THEN SetAPen(view_window.rport,mybase.rgbselect) ELSE SetAPen(view_window.rport,mybase.rgbnormal)
IF d_obj.bounded=TRUE
list_vertices:=[d_obj.objminx,d_obj.objminy,d_obj.objminz,
d_obj.objminx,d_obj.objmaxy,d_obj.objminz,
d_obj.objmaxx,d_obj.objmaxy,d_obj.objminz,
d_obj.objmaxx,d_obj.objminy,d_obj.objminz,
d_obj.objminx,d_obj.objminy,d_obj.objmaxz,
d_obj.objminx,d_obj.objmaxy,d_obj.objmaxz,
d_obj.objmaxx,d_obj.objmaxy,d_obj.objmaxz,
d_obj.objmaxx,d_obj.objminy,d_obj.objmaxz]
SetAPen(view_window.rport,2)
t_faces:=12
d_faces:=data_boundedbox
list_datapts:=list_vertices
ELSE
t_faces:=d_obj.nbrsfcs
d_faces:=d_obj.datafcs
list_datapts:=d_faces
ENDIF
curs:=d_faces
FOR b_faces:=0 TO t_faces-1
p_DrawFace(d_obj,Long(curs),Long(curs+4),Long(curs+8),list_datapts)
curs:=curs+12
IF stop_mes:=Gt_GetIMsg(view_window.userport)
stop_type:=stop_mes.class
IF stop_type=IDCMP_RAWKEY
stop_infos:=stop_mes.code
IF stop_infos=$21 THEN JUMP fini
ENDIF
ENDIF
ENDFOR
IF list_vertices THEN Dispose(list_vertices)
ENDIF
mynode:=mynode.succ
ENDWHILE
JUMP fini
fini:
WHILE stop_mes:=Gt_GetIMsg(view_window.userport) DO Gt_ReplyIMsg(stop_mes)
CloseW(adr_req)
ENDPROC
/**/
/*"p_DrawFace(d_obj,num_p1,num_p2,num_p3) :Dessine une face."*/
PROC p_DrawFace(d_obj:PTR TO object3d,num_p1,num_p2,num_p3,list_datapts)
/********************************************************************************
* Para : Num object,Num vertice 1,Num vertice 2,Num vertice 3,datapts
* Return : NONE
* Description : Draw one face.
*******************************************************************************/
DEF x1,y1,z1,x2,y2,z2,x3,y3,z3
DEF fx_one=NIL,fx_two=NIL,fx_three=NIL,fy_one=NIL,fy_two=NIL,fy_three=NIL
DEF plan
plan:=mybase.plan
IF d_obj.bounded=FALSE
list_datapts:=d_obj.datapts
ENDIF
x1:=mybase.signex*Long(list_datapts+(num_p1*12))
y1:=mybase.signey*Long(list_datapts+(num_p1*12)+4)
z1:=mybase.signez*Long(list_datapts+(num_p1*12)+8)
x2:=mybase.signex*Long(list_datapts+(num_p2*12))
y2:=mybase.signey*Long(list_datapts+(num_p2*12)+4)
z2:=mybase.signez*Long(list_datapts+(num_p2*12)+8)
x3:=mybase.signex*Long(list_datapts+(num_p3*12))
y3:=mybase.signey*Long(list_datapts+(num_p3*12)+4)
z3:=mybase.signez*Long(list_datapts+(num_p3*12)+8)
SELECT plan
CASE PLAN_XOY
fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x1)),mybase.format),SpFlt(mybase.centrex))
fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x2)),mybase.format),SpFlt(mybase.centrex))
fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x3)),mybase.format),SpFlt(mybase.centrex))
fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(y1)),SpFlt(mybase.centrey))
fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(y2)),SpFlt(mybase.centrey))
fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(y3)),SpFlt(mybase.centrey))
CASE PLAN_XOZ
fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x1)),mybase.format),SpFlt(mybase.centrex))
fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x2)),mybase.format),SpFlt(mybase.centrex))
fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(x3)),mybase.format),SpFlt(mybase.centrex))
fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(z1)),SpFlt(mybase.centrey))
fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(z2)),SpFlt(mybase.centrey))
fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(z3)),SpFlt(mybase.centrey))
CASE PLAN_YOZ
fx_one:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y1)),mybase.format),SpFlt(mybase.centrex))
fx_two:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y2)),mybase.format),SpFlt(mybase.centrex))
fx_three:=SpAdd(SpMul(SpMul(mybase.echelle,SpFlt(y3)),mybase.format),SpFlt(mybase.centrex))
fy_one:=SpAdd(SpMul(mybase.echelle,SpFlt(z1)),SpFlt(mybase.centrey))
fy_two:=SpAdd(SpMul(mybase.echelle,SpFlt(z2)),SpFlt(mybase.centrey))
fy_three:=SpAdd(SpMul(mybase.echelle,SpFlt(z3)),SpFlt(mybase.centrey))
ENDSELECT
x1:=SpFix(fx_one)
x2:=SpFix(fx_two)
x3:=SpFix(fx_three)
y1:=SpFix(fy_one)
y2:=SpFix(fy_two)
y3:=SpFix(fy_three)
IF ((mybase.drawmode=DRAW_PTS) OR (mybase.drawmode=DRAW_PTSFCS))
SetAPen(view_window.rport,mybase.rgbpts)
RectFill(view_window.rport,x1-1,y1-1,x1+1,y1+1)
RectFill(view_window.rport,x2-1,y2-1,x2+1,y2+1)
RectFill(view_window.rport,x3-1,y3-1,x3+1,y3+1)
/*=================================
WritePixel(view_window.rport,x1,y1)
WritePixel(view_window.rport,x2,y2)
WritePixel(view_window.rport,x3,y3)
===================================*/
SetAPen(view_window.rport,mybase.rgbnormal)
ENDIF
IF ((mybase.drawmode=DRAW_FCS) OR (mybase.drawmode=DRAW_PTSFCS))
IF d_obj.selected=TRUE
SetAPen(view_window.rport,mybase.rgbselect)
ELSEIF d_obj.bounded=TRUE
SetAPen(view_window.rport,mybase.rgbbounding)
ELSE
SetAPen(view_window.rport,mybase.rgbnormal)
ENDIF
Move(view_window.rport,x1,y1)
Draw(view_window.rport,x2,y2)
Move(view_window.rport,x2,y2)
Draw(view_window.rport,x3,y3)
Move(view_window.rport,x3,y3)
Draw(view_window.rport,x1,y1)
ENDIF
ENDPROC
/**/
/*"p_CentreObjs() :Centre tous les objets."*/
PROC p_CentreObjs()
/********************************************************************************
* Para : NONE
* Return : NONE
* Description : Center Database in 0,0,0 and Call rebuildminmax().
*******************************************************************************/
DEF c_obj:PTR TO object3d,cp=NIL,curs=NIL
DEF c_point:PTR TO vertices
DEF mylist:PTR TO lh,mynode:PTR TO ln
dWriteF(['CentreObjs()\n'],[0])
mylist:=mybase.objlist
mynode:=mylist.head
WHILE mynode
IF mynode.succ<>0
c_obj:=mynode
curs:=c_obj.datapts
dWriteF(['Obj Adr:\h ','NbrsPts:\d\n'],[c_obj,c_obj.nbrspts])
c_obj.objcx:=c_obj.objcx-mybase.basecx
c_obj.objcy:=c_obj.objcy-mybase.basecy
c_obj.objcz:=c_obj.objcz-mybase.basecz
FOR cp:=0 TO c_obj.nbrspts-1
c_point:=curs
c_point.x:=c_point.x-mybase.basecx
c_point.y:=c_point.y-mybase.basecy
c_point.z:=c_point.z-mybase.basecz
curs:=curs+12
ENDFOR
ENDIF
mynode:=mynode.succ
ENDWHILE
p_RebuildMinMax()
ENDPROC
/**/
/*"p_RebuildMinMax() :recalcule les lini est maxi des objets."*/
PROC p_RebuildMinMax()
/********************************************************************************
* Para : NONE
* Return : NONE
* Description : rebuild the Min and Max of all objects and database.
*******************************************************************************/
DEF re_obj:PTR TO object3d
DEF re_pts:PTR TO vertices
DEF b1=NIL,curs,nx,ny,nz
DEF o_minx,o_maxx,o_miny,o_maxy,o_minz,o_maxz,o_cx=NIL,o_cy=NIL,o_cz=NIL
DEF mylist:PTR TO lh,mynode:PTR TO ln
mybase.minx:=10000000
mybase.maxx:=-10000000
mybase.miny:=10000000
mybase.maxy:=-10000000
mybase.minz:=10000000
mybase.maxz:=-10000000
/*****************/
mylist:=mybase.objlist
mynode:=mylist.head
WHILE mynode
IF mynode.succ<>0
re_obj:=mynode
o_minx:=10000000
o_maxx:=-10000000
o_miny:=10000000
o_maxy:=-10000000
o_minz:=10000000
o_maxz:=-10000000
re_pts:=re_obj.datapts
curs:=re_pts
FOR b1:=0 TO re_obj.nbrspts-1
re_pts:=curs
nx:=re_pts.x
ny:=re_pts.y
nz:=re_pts.z
IF nx>=mybase.maxx THEN mybase.maxx:=nx
IF nx<mybase.minx THEN mybase.minx:=nx
IF ny>=mybase.maxy THEN mybase.maxy:=ny
IF ny<mybase.miny THEN mybase.miny:=ny
IF nz>=mybase.maxz THEN mybase.maxz:=nz
IF nz<mybase.minz THEN mybase.minz:=nz
/**********************/
IF nx>=o_maxx THEN o_maxx:=nx
IF nx<o_minx THEN o_minx:=nx
IF ny>=o_maxy THEN o_maxy:=ny
IF ny<o_miny THEN o_miny:=ny
IF nz>=o_maxz THEN o_maxz:=nz
IF nz<o_minz THEN o_minz:=nz
curs:=curs+12
ENDFOR
o_cx:=o_minx+Div((o_maxx-o_minx),2)
o_cy:=o_miny+Div((o_maxy-o_miny),2)
o_cz:=o_minz+Div((o_maxz-o_minz),2)
re_obj.objcx:=o_cx
re_obj.objcy:=o_cy
re_obj.objcz:=o_cz
re_obj.objminx:=o_minx
re_obj.objmaxx:=o_maxx
re_obj.objminy:=o_miny
re_obj.objmaxy:=o_maxy
re_obj.objminz:=o_minz
re_obj.objmaxz:=o_maxz
ENDIF
mynode:=mynode.succ
ENDWHILE
mybase.basecx:=mybase.minx+Div((mybase.maxx-mybase.minx),2)
mybase.basecy:=mybase.miny+Div((mybase.maxy-mybase.miny),2)
mybase.basecz:=mybase.minz+Div((mybase.maxz-mybase.minz),2)
ENDPROC
/**/
/**/